package demo3;

//接口就是公共的行为规范标准，大家在实现时，只要符合规范标准，就可以通用。
//在Java中，接口可以看成是：多个类的公共规范，是一种引用数据类型。

//1.使用interface来定义一个接口
//2.接口当中的成员变量 默认是public static final来修饰的，一般情况下我们不写
//3.接口当中的成员方法 默认是public abstract来修饰的，一般情况下我们不写
//4.在接口中，我们不能写普通的成员方法
//5.Java8开始，定义一个default的方法，是可以有具体的实现
//6.接口当中，有被static修饰的方法，是可以有具体的实现
//7.接口不能被new关键字来进行实例化
//8.类和接口之间，我们可以使用 implements 来实现接口（这个是表示实现关系，但是意思同继承关系）
//9.类实现了接口，那么该子类就要重写接口中的所有抽象的方法
//10.接口也可以发生了向上转型和动态绑定
//11.接口当中，不能使用构造方法和静态代码块
//12，当一个类实现了接口当中的方法之后，当前类中的方法不能不加public，因为原来接口中的方法是public修饰的，所以重写的方法要大于等于public的范围
//13，如果类没有实现接口中的所有的抽象方法，则类必须设置为抽象类
//14.一个接口中也会产生独立的字节码文件
interface IShape{//一般情况下我们以I开头来表示接口的
    int a = 10;
    void draw();
    default void test(){
        System.out.println("test()");
    }
    public static void test2(){
        System.out.println(" static test2()");
    }
}
class Rect implements IShape{
    @Override
    public void draw() {
        System.out.println("矩形");
    }
}
class Flower implements IShape{
    @Override
    public void draw() {
        System.out.println("花");
    }
}
abstract class A implements IShape{
    //当然了，还是要还的，因为他只能被用来继承
}
public class TestDemo {
    public static void  drawMap(IShape iShape){
        iShape.draw();//重写了接口中的抽象方法，子类继承了，那么调用时会发生了向上转型，从而发生动态绑定
    }
    public static void main(String[] args) {
        //IShape iShape = new IShape();//所以不能实例化
        //但是能向上转型
        IShape iShape1 = new Flower();
        IShape iShape2 = new Rect();
//        drawMap(new Rect());
//        drawMap(new Flower());
        drawMap(iShape1);
        drawMap(iShape2);
    }
    //注意：
    //1. 创建接口时, 接口的命名一般以大写字母 I 开头.
    //2. 接口的命名一般使用 "形容词" 词性的单词.
    //3. 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性.


}
